#include <iostream>

class Car // 被装饰的抽象类
{
public:
    Car() = default;
    Car(const std::string &name) : name(name) {}
    virtual void showInfo() = 0;

protected:
    std::string name;
};

class BMW : public Car // 被装饰的具体类
{
public:
    using Car::Car;
    void showInfo()
    {
        std::cout << name << std::endl;
    }
};

class Decorate : public Car // 抽象装饰类
{
public:
    using Car::Car;
    void decorate(Car *c) // 传递要装饰的对象
    {
        this->c = c;
    }
protected:
    Car *c; // 要装饰的对象
};

class SelfDrive:public Decorate   // 具体装饰类  // 自动驾驶
{
public:
   void showInfo()
   {
    std::cout<<"自动驾驶"<<std::endl;
    c->showInfo();
   }
};

class Navigator:public Decorate  // 导航
{
public:
   void showInfo()
   {
    std::cout<<"导航"<<std::endl;
    c->showInfo();
   }
};

class VoiceControl:public Decorate  // 语音控制
{
public:
   void showInfo()
   {
    std::cout<<"语音控制"<<std::endl;
    c->showInfo();
   }
};

int main()
{
    Car *c = new BMW("宝马");
    // c->showInfo();   // 显示具体信息

    Decorate *d1 = new SelfDrive;
    Decorate *d2 = new VoiceControl;
    Decorate *d3 = new Navigator;
    d1->decorate(c);   // 给宝马车添加自动驾驶功能
    d2->decorate(d1);  // 给自动驾驶的宝马添加语音控制功能   
    d3->decorate(d2);  // 给语音控制的自动驾驶宝马添加导航功能
    
    d3->showInfo();    // 显示所有功能 
    return 0;
}
